import { Op, Sequelize } from "sequelize";
import { model } from "../defmodel"; // 方案一模型

// import  model  from "../../decormodel/UserInfo"; // 方案三模型

class UserDao {
  // 单列设计模式  nest.js 自动装配置
  static userDao: UserDao = new UserDao();

  // 添加用户
  addUser(userinfo: Userinfo) {
    console.log(userinfo);
    // return model.create(userinfo);
  }
  // 查询用户全部
  findAllUser() {
    return model.findAll({
      raw: true, // 值看数据原数据，不看底层数据
    });
  }
  // 条件查询
  findByProps() {
    return model.findAll({
      raw: true, // 值看数据原数据，不看底层数据
      attributes: ["username"], // 要仅选择某些属性，选取表中的特定列
    });
  }
  findByLike(key: string) {}
  // 查询用户和密码
  findByUsmAndPsw() {
    // findOne 确定只有一条数据就
    return model.findOne({
      raw: true, // 值看数据原数据，不看底层数据
      attributes: ["username"], // 要仅选择某些属性，选取表中的特定列
    });
  }
  // 模糊查询
  findByUsmAndAddr() {
    return model.findAll({
      raw: true,
      where: {
        [Op.or]: [
          {
            // 用户名
            username: {
              [Op.like]: "王%",
            },
          },
          {
            // 地址
            address: "wuhan",
          },
        ],
      },
    });
  }
  // 按地址计算所有用户 select address,count(valid) from  userinfos where  valid=1 group by  address;
  countUserinfo() {
    return model.findAll({
      raw: true, // 值看数据原数据，不看底层数据
      group: "address", //分组
      attributes: [
        "address",
        [Sequelize.fn("count", Sequelize.col("valid")), "total"],
      ], // 要仅选择某些属性，选取表中的特定列 total是别名
      //条件
      where: {
        valid: 1,
      },
    });
  }

  // 分页
  findUserWithPager(offset: number, pageSize: number) {
    return model.findAll({
      raw: true, // 值看数据原数据，不看底层数据
      limit: pageSize,
      offset,
    });
  }
}

export type Userinfo = {
  userid: number;
  username: string;
  psw: string;
  address: string;
  valid: number;
};

export default UserDao.userDao;
